package com.evil.kingdom.pojo.entity.action;

import com.evil.common.mongo.entity.SingleName;
import com.evil.kingdom.pojo.entity.world.city.City;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotEmpty;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.index.Indexed;
import org.springframework.data.mongodb.core.mapping.Document;

import java.util.LinkedList;

/**
 * 导航本
 *
 * @author liyang
 * @date 2024-05-24 09:28
 */
@Getter
@Setter
@Document
public class Vector implements SingleName {

    /**
     * 名称
     * 出发地_目的地
     *
     * @see City#getName()
     */
    @Id
    @NotBlank(message = "名称不能为空")
    private String name;

    /**
     * 出发地名称
     */
    @Indexed(name = "vectorDepartName")
    @NotBlank(message = "出发地名称不能为空")
    private String departName;

    /**
     * 目的地名称
     */
    @Indexed(name = "vectorDestName")
    @NotBlank(message = "目的地名称不能为空")
    private String destName;

    /**
     * 路径点
     * 默认出发地+目的地
     */
    @NotEmpty(message = "路径点不能为空")
    private LinkedList<ActionPosition> positions;

    public Vector() {
        this.positions = new LinkedList<>();
    }

    /**
     * 计算导航本名称
     *
     * @param departName 出发地名称
     * @param destName   目的地名称
     * @return 导航本名称
     */
    public static String calVectorName(@NotBlank(message = "导航本出发地名称不能为空") String departName, @NotBlank(message = "导航本目的地名称不能为空") String destName) {
        return String.format("%s_%s", departName, destName);
    }

    @Override
    public String getEntityName() {
        return "导航本";
    }

    public LinkedList<ActionPosition> newReversePosition() {
        LinkedList<ActionPosition> actionPositions = new LinkedList<>();
        for (int i = positions.size() - 1; i >= 0; i--) {
            actionPositions.add(positions.get(i).reverse());
        }
        return actionPositions;
    }

    @Getter
    @Setter
    @NoArgsConstructor
    @AllArgsConstructor
    public static class Route {
        /**
         * 出发地名称
         */
        private String departName;
        /**
         * 目的地名称
         */
        private String destName;
    }
}
